昨天我們把代購 App 的靜態資料結構定案——買家、商品、訂單這些實體怎麼互相關聯,也知道哪張表該有哪些欄位。但資料表只回答了「東西存在哪裡」,沒有回答「畫面現在應該長什麼樣子」。設計師常畫出精美的靜態頁面,但實際開發時,使用者點擊按鈕、網路延遲、資料載入失敗,都會讓同一個畫面長出完全不同的樣貌。如果沒有一套嚴謹的規則定義這些狀態之間怎麼切換,系統很容易出現「狀態爆炸」——狀態數量隨功能增加而失控成長,讓人再也講不清楚畫面現在到底處於哪一種情況。這時候,有限狀態機(FSM)的概念,就是把混沌的互動邏輯,轉化成可預測的工程規範。
定義:指 UI 在不同情境下所呈現的具體視覺與功能樣態,以及這些樣態之間如何切換的規則。
目的:確保使用者在與系統互動時,介面始終處於「已知」且「合乎預期」的狀態,避免出現像是「Loading 畫面卡住且無法取消」這種異常情境。
常見的 UI 狀態:
定義:一種數學模型,用來描述系統在任何給定時間點下,只能處於有限數量中的其中一種狀態,並且只能透過特定的事件(Event)觸發狀態的轉移(Transition)。
關鍵組成:
以代購 App 的登入功能為例,用 FSM 的邏輯規劃一次:
把「Error」跟「回到 Idle」分成兩個獨立的轉換,而不是同一步驟一次做完,是這裡的關鍵:FSM 每一次轉換只能對應一個明確的事件跟一個明確的目的狀態,不能「同時」發生兩件事。
學習 UI 狀態遷移與 FSM 之後,我意識到過去自己在規劃系統邏輯時,常常只想著 Happy Path,忽略了「當事情不如預期時,系統該怎麼走」。FSM 強迫我們窮舉所有狀態與轉換路徑,這不只讓開發與測試更有明確依據,也讓使用者體驗更一致。把這種思維放進代購 App 的登入、送出委託等每一個互動裡,系統的邏輯會更健壯,也更容易維護。一開始不知道「狀態爆炸」這個概念時,遇到畫面表現異常,我只能籠統地說「發生錯誤」,完全講不出是哪個環節出了問題,更別提要從哪裡下手修,只能用這種很大範圍的話一言以蔽之。學了 FSM 之後,我才有辦法把「發生錯誤」拆解成具體的狀態跟轉換——是哪個事件沒有對應到正確的狀態、還是哪條轉換路徑根本沒被定義到,才終於有語言可以精準描述問題出在哪裡。